#ifndef TCPSOCKET_H
#define TCPSOCKET_H

#pragma once
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <string>

class TcpSocket {
public:
    TcpSocket(int fd);
    TcpSocket();
    ~TcpSocket();
    bool connectToHost(const std::string ip, unsigned short port, int timeout = 0);
    // 通信
    int sendMsg(std::string msg, int timeout = 0);
    std::string recvMsg(int timeout = 0);
    std::string recvn(int n, int timeout = 0);
    // 从中读取一个32位的整数
    int peek32(int n);
    // 截取前n个字节作为后续数据的长度，然后再读取后续数据
    std::string peek32Msg(int n);
    int getFd() const { return fd; }
    void setNoBlock();
    void setBlock();
private:
   bool isConnectTimeout(sockaddr_in* addr,int timeout = 1000);
    /* 借助select io多路复用技术来实现超时功能
    返回false 说明没有超时，
    返回true说明超时，或者有异常，有异常就设置errno来判断具体是什么错误
    */
    bool isTimeout(int timeout);
    void showTimeoutLog(const std::string typeStr);
    

private:
    int fd;
};

#endif